﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
using Microsoft.Win32;
using JasRibbonApplicatie.Classes;
using JasRibbonApplicatie.Model;

namespace JasRibbonApplicatie.Views
{
    /// <summary>
    /// Interaction logic for PrintLabels.xaml
    /// </summary>
    public partial class PrintLabels : Page
    {
        //10,4 x 7,3
        private EtikettenPagina grotePagina = new EtikettenPagina("Avery Groot papier A4", new Thickness(0), 2, 4, 400, 280, new Thickness(20,15,20,55));
        //7 x 3,5
        private EtikettenPagina kleinePagina = new EtikettenPagina("Avery Klein papier A4", new Thickness(0, 0, 0, 20), 3, 8, 260, 138, new Thickness(10,30,10,30));
        //7 x 3,5 etiket => doormidden
        private EtikettenPagina bandjePagina = new EtikettenPagina("Avery Klein papier A4", new Thickness(0, 0, 0, 0), 3, 16, 260, 69, new Thickness(10,12,10,15));

        private static GebruikerModel gm = new GebruikerModel();

        public PrintLabels()
        {
            InitializeComponent();
        }

        private void materiaalRadioButton_Checked(object sender, RoutedEventArgs e)
        {
            LabelFormaatGroupBox.Visibility = Visibility.Visible;
            magazijnierGroupBox.Visibility = Visibility.Collapsed;
            voorbeeldGroupBox.Visibility = Visibility.Collapsed;
        }

        private void toebehorenRadioButton_Checked(object sender, RoutedEventArgs e)
        {
            LabelFormaatGroupBox.Visibility = Visibility.Visible;
            magazijnierGroupBox.Visibility = Visibility.Collapsed;
            voorbeeldGroupBox.Visibility = Visibility.Collapsed;
        }

        private void magazijnierRadioButton_Checked(object sender, RoutedEventArgs e)
        {
            LabelFormaatGroupBox.Visibility = Visibility.Collapsed;
            magazijnierGroupBox.Visibility = Visibility.Visible;
            voorbeeldGroupBox.Visibility = Visibility.Collapsed;
            aantalGroupBox.Visibility = Visibility.Collapsed;
            magazijnierComboBox.ItemsSource = gm.GetAllMagazijniers();
        }

        private void formaatRadioButton_Checked(object sender, RoutedEventArgs e)
        {
            aantalGroupBox.Visibility = Visibility.Visible;
            voorbeeldGroupBox.Visibility = Visibility.Collapsed;
        }

        private void aantalPaginaDoubleUpDown_ValueChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            voorbeeldGroupBox.Visibility = Visibility.Visible;
            badgeprintpreviewCanvas.Visibility = Visibility.Collapsed;

            fillPrintPreviewCanvas();

            printpreviewCanvas.Visibility = Visibility.Visible;
            //TODO: als 'k op invisible zet print die nix en anders valt die buiten beeld
            
        }

        private void fillPrintPreviewCanvas()
        {

            int aantalPagina = int.Parse(aantalPaginaDoubleUpDown.Value.ToString());
            StreepjesCode.CodeType codeType = (materiaalRadioButton.IsChecked == true) ? StreepjesCode.CodeType.Materiaal : (toebehorenRadioButton.IsChecked == true) ? StreepjesCode.CodeType.Toebehoren : StreepjesCode.CodeType.Gebruiker;

            string startCode = "M0090";
            //string startCode = "T02D0";

            EtikettenPagina etikettenPagina = null;
            if (kleinRadioButton.IsChecked == true) etikettenPagina = kleinePagina;
            if (grootRadioButton.IsChecked == true) etikettenPagina = grotePagina;
            if (bandjeRadioButton.IsChecked == true) etikettenPagina = bandjePagina;

            aantalLabel.Content = aantalPagina * etikettenPagina.Rijen * etikettenPagina.Kolommen;

            etikettenPagina.SetPreview(printpreviewCanvas, aantalPagina, codeType, startCode);
            printpreviewCanvas.LayoutTransform = new ScaleTransform(0.2, 0.2);
            
        }

        private void fotobladerenButton_Click(object sender, RoutedEventArgs e)
        {
            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.FileName = ""; // Default file name
            dlg.DefaultExt = ".jpg"; // Default file extension
            dlg.Filter = "Afbeeldingen (*.jpg, *.png, *.bmp)|*.jpg;*.png;*.bmp;"; // Filter files by extension

            // Show open file dialog box
            Nullable<bool> result = dlg.ShowDialog();

            // Process open file dialog box results
            if (result == true)
            {
                fotoTextBox.Text = dlg.FileName;
                if (File.Exists(fotoTextBox.Text))
                    fotoImage.Source = (new ImageSourceConverter()).ConvertFromString(dlg.FileName) as ImageSource;

                if (magazijnierComboBox.SelectedItem != null)
                {

                    voorbeeldGroupBox.Visibility = Visibility.Visible;
                    printpreviewCanvas.Visibility = Visibility.Collapsed;
                    badgeprintpreviewCanvas.Visibility = Visibility.Visible;
                }
            }
        }

        private void magazijnierComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            Magazijnier mag = magazijnierComboBox.SelectedItem as Magazijnier;
            if (mag != null)
            {
                string url = StreepjesCode.getStreepjesCode(mag.streepjescode);
                barcodeImage.Source = (new ImageSourceConverter()).ConvertFromString(url) as ImageSource;
                barcodeLabel.Content = mag.streepjescode.ToUpper();
                naamLabel.Content = mag.gebruiker.naam + " " + mag.gebruiker.voornaam;

                if (gm.IsRaadVanBestuur(mag.gebruiker))
                {
                    string functie = mag.gebruiker.lidRvbs.Last().functie;
                    functieLabel.Content = char.ToUpper(functie[0]) + functie.Substring(1); ;
                }
                else
                {
                    if (gm.IsMagazijnier(mag.gebruiker))
                    {
                        functieLabel.Content = "Magazijnier";
                    }
                    else
                    {
                        functieLabel.Content = "Geen functie gevonden";
                    }
                }

                if (fotoTextBox.Text != "" && File.Exists(fotoTextBox.Text))
                {
                    voorbeeldGroupBox.Visibility = Visibility.Visible;
                    printpreviewCanvas.Visibility = Visibility.Collapsed;
                    badgeprintpreviewCanvas.Visibility = Visibility.Visible;

                }
            }
        }

        private void printButton_Click(object sender, RoutedEventArgs e)
        {
            PrintDialog dialog = new PrintDialog();
            if (dialog.ShowDialog() == true)
            {
                printpreviewCanvas.LayoutTransform = new ScaleTransform(1, 1);
                if (magazijnierRadioButton.IsChecked == true)
                    dialog.PrintVisual(badgeprintpreviewCanvas.Children[0], "My Canvas");
                else
                {
                    foreach(UIElement page in printpreviewCanvas.Children)
                        dialog.PrintVisual(page, "My Canvas");
                }
            }
            
        }

        private void margin_ValueChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            if(pagemargintDoubleUpDown != null && pagemarginbDoubleUpDown!= null && labelmargintDoubleUpDown!= null && labelmarginbDoubleUpDown!= null)
            if (pagemargintDoubleUpDown.Value != null && pagemarginbDoubleUpDown.Value != null && labelmargintDoubleUpDown.Value != null && labelmarginbDoubleUpDown.Value != null)
            {
                bandjePagina.PageMargin = new Thickness(bandjePagina.PageMargin.Left, (double)pagemargintDoubleUpDown.Value, bandjePagina.PageMargin.Right, (double)pagemarginbDoubleUpDown.Value);
                bandjePagina.LabelMargin = new Thickness(bandjePagina.LabelMargin.Left, (double)labelmargintDoubleUpDown.Value, bandjePagina.LabelMargin.Right, (double)labelmarginbDoubleUpDown.Value);
            }

        }

        private void labelhoogteDoubleUpDown_ValueChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            if (labelhoogteDoubleUpDown.Value !=null)
            {
                bandjePagina.LabelHoogte = int.Parse(labelhoogteDoubleUpDown.Value.ToString());
            }
        }
    }
}
